
asmSobel:
	Entrar					; Convencion C
	init					; inicializa los registros segun tamaño de la imagen
	
		cmp dword DX,0		; hace SobelX, SobelY o SobelXY segun los parametros
		je cmpy
		cmp dword DY,0
		jg doXY
		call asmSobelx
		jmp listo
	doXY:
		call asmSobelxy
		jmp listo
	cmpy:
		cmp dword DY,0
		je listo
		call asmSobely
		jmp listo
	listo:
		Salir

asmSobelx:
	.for:
		push ecx		;ecx=acumulador y contador de loop
		xor ecx,ecx		;lo guardo en la pila y lo limpio
		
		;eax = SOBELX[0][0]*esi + SOBELX[0][1]*esi+1 + ...

		mul_m1 esi		;SOB 0 0	
		mul_p1 esi+2	;SOB 0 2
		mul_m2 edx		;SOB 1 0
		mul_p2 edx+2	;SOB 1 2
		mul_m1 ebx		;SOB 2 0
		mul_p1 ebx+2	;SOB 2 2
		
		drawit_pos		;saturar y escribir el pixel en la imagen destino
		inc esi			;incremento los 3 pointers de src y el pointer de destino
		inc edx
		inc ebx
		inc edi
		pop ecx			;restauro ecx para usarlo de contador 
		loop .for
	ret

asmSobely:
	.for:
		push ecx
		xor ecx,ecx
		
		; Idem SobelX pero con otra matriz
		mul_m1 esi		;SOB 0 0
		mul_m2 esi+1	;SOB 0 1
		mul_m1 esi+2	;SOB 0 2
		mul_p1 ebx		;SOB 2 0
		mul_p2 ebx+1	;SOB 2 1
		mul_p1 ebx+2	;SOB 2 2
		
		drawit_pos
		inc esi
		inc edx
		inc ebx
		inc edi
		pop ecx
		loop .for
	ret

asmSobelxy:
	for_sobelxy:
		push ecx

		;sobel X

		xor ecx,ecx
		mul_m1 esi		;SOB 0 0	
		mul_p1 esi+2	;SOB 0 2
		mul_m2 edx		;SOB 1 0
		mul_p2 edx+2	;SOB 1 2
		mul_m1 ebx		;SOB 2 0
		mul_p1 ebx+2	;SOB 2 2

		abs
		push ecx

		;sobel Y

		xor ecx,ecx
		mul_m1 esi		;SOB 0 0
		mul_m2 esi+1	;SOB 0 1
		mul_m1 esi+2	;SOB 0 2
		mul_p1 ebx		;SOB 2 0
		mul_p2 ebx+1	;SOB 2 1
		mul_p1 ebx+2	;SOB 2 2

		abs
		add ecx,[esp]

		; X + Y

		add esp,4			;lo saco de la pila
		sar ecx,1			;ecx/=2   ( ecx=(abs(sobelX)+abs(sobelY))/2 )

		; Saturo y dibujo el pixel en el destino

		drawit
		inc esi
		inc edx
		inc ebx
		inc edi
		pop ecx

		; salto a la proxima iteracion

		dec ecx
		cmp ecx,0
		jg for_sobelxy
	ret

